<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>photometric_stereo [HALCON算子参考手册]</title>
<style type="text/css">
      body {
    color: #000000;
    background-color: #ffffff;
    margin: 0;
    font-family: Arial, Helvetica, sans-serif;
}

.body_main {
    margin-left: 35px;
    margin-right: 35px;
}

@media screen and (min-width:992px) {

    .body_main {
        margin-left: 10%;
        margin-right: 10%;
    }

    table.toctable {
        width: 80%
    }
}

@media screen and (min-width:1400px) {

    .body_main {
        margin-left: 15%;
        margin-right: 15%;
    }

    table.toctable {
        width: 70%
    }
}

body>div ul ul {
    margin-left: inherit;
}

a:link {
    color: #0044cc;
}

a:link,
a:visited {
    text-decoration: none;
}

a:link:hover,
a:visited:hover {
    text-decoration: underline;
}

th {
    text-align: left;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    text-rendering: optimizeLegibility;
    color: #666666;
}

code {
    font-family: monospace,monospace;
}

h1 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

h2 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

hr {
    border: 0;
    border-top: solid 1px #f28d26;
}

.pre {
    display: block;
    padding-bottom: 1ex;
    font-family: monospace;
    white-space: pre;
}

pre {
    font-family: monospace, monospace;
    padding: 1ex;
    white-space: pre-wrap;
}

.toc {
    font-size: 80%;
    border-top: 1px dashed #f28d26;
    border-bottom: 1px dashed #f28d26;
    padding-top: 5px;
    padding-bottom: 5px;
}

.inv {
    margin: 0;
    border: 0;
    padding: 0;
}

.banner {
    color: #666666;
    padding-left: 1em;
}

.logo {
    background-color: white;
}

.keyboard {
    font-size: 80%;
    padding-left: 3px;
    padding-right: 3px;
    border-radius: 5px;
    border-width: 1px;
    border-style: solid;
    border-color: #f28d26;
    background-color: #f3f3f3;
}

.warning {
    margin-top: 2ex;
    margin-bottom: 1ex;
    padding: 10px;
    text-align: center;
    border: 1px solid;
    color: #bb0000;
    background-color: #fff7f7
}

.imprint {
    margin-top: 1ex;
    font-size: 80%;
    color: #666666;
}

.imprinthead {
    font-weight: bolder;
    color: #666666;
}

.indexlink {
    text-align: right;
    padding-bottom: 5px;
}

.postscript {
    margin-top: 2ex;
    font-size: 80%;
    color: #666666
}

.evenrow {
    background-color: #e7e7ef;
    vertical-align: top;
}

.oddrow {
    background-color: #f7f7ff;
    vertical-align: top;
}

.headrow {
    background-color: #97979f;
    color: #ffffff;
    vertical-align: top;
}

.logorow {
    vertical-align: top;
}

.error {
    color: red;
}

.var {
    font-style: italic
}

.halconoperator {
    font-family: monospace, monospace;
}

span.operator {
    font-family: monospace, monospace;
}

span.procedure {
    font-family: monospace, monospace;
}

span.operation {
    font-family: monospace, monospace;
}

span.feature {
    font-family: Arial, Helvetica, Homerton, sans-serif;
}

ul {
    padding-left: 1.2em;
}

li.dot {
    list-style-type: square;
    color: #f28d26;
}

.breadcrumb {
    font-size: 80%;
    color: white;
    background-color: #062d64;
    margin-bottom: 20px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 15px;
}

.webbar {
    font-size: 80%;
    background-color: #dddddd;
    margin-top: 0px;
    margin-left: -35px;
    margin-right: -35px;
    margin-bottom: 0px;
    padding-top: 5px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 5px;
}

.footer {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    border-top: 1px dashed #f28d26;
    font-size: 80%;
    color: #666666;
    padding-bottom: 8px;
}

.footer .socialmedia a {
    padding-left: 7px;
}

.socialmedia {
    padding-top: 10px;
}

.copyright {
    margin-top: 19px;
}

.breadcrumb a {
    color: #ffffff;
    border-bottom: 1px solid white;
}

.breadcrumb a:link:hover,
.breadcrumb a:visited:hover {
    text-decoration: none;
    border-bottom: none;
}

.heading {
    margin-top: 1ex;
    font-size: 110%;
    font-weight: bold;
    color: #666666;
}

.text {
    color: black;
}

.example {
    font-size: 80%;
    background-color: #f3f3f3;
    border: 1px dashed #666666;
    padding: 10px;
}

.displaymath {
    display: block;
    text-align: center;
    margin-top: 1ex;
    margin-bottom: 1ex;
}

.title {
    float: left;
    padding-top: 3px;
    padding-bottom: 3px;
}

.signnote {
    font-family: Arial, Helvetica, Homerton, sans-serif;
    font-size: 80%;
    color: #666666;
    font-weight: lighter;
    font-style: italic
}

.par {
    margin-bottom: 1.5em;
}

.parhead {
    text-align: right;
}

.parname {
    float: left;
}

.pardesc {
    font-size: 85%;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
    margin-left: 2em;
}

.parcat {
    color: #666;
    font-weight: bold;
}

*[data-if=cpp],
*[data-if=c],
*[data-if=dotnet],
*[data-if=com],
*[data-if=python] {
    display: none;
}

.tabbar {
    text-align: right;
    border-bottom: 1px solid #f28d26;
    margin-bottom: 0.5em;
}

ul.tabs {
    padding-top: 3px;
    padding-bottom: 3px;
    margin-top: 10px;
    margin-bottom: 0;
    font-size: 80%
}

ul.tabs li {
    padding-top: 3px;
    padding-bottom: 3px;
    display: inline;
    overflow: hidden;
    list-style-type: none;
    margin: 0;
    margin-left: 8px;
    border-top: 1px solid #666;
    border-left: 1px solid #666;
    border-right: 1px solid #666;
}

ul.tabs li.active {
    border-left: 1px solid #f28d26;
    border-right: 1px solid #f28d26;
    border-top: 1px solid #f28d26;
    border-bottom: 1px solid #fff;
}

ul.tabs li.inactive {
    background-color: #eee;
}

ul.tabs li a {
    padding-left: 5px;
    padding-right: 5px;
    color: #666;
}

ul.tabs li a:link:hover {
    text-decoration: none;
}

ul.tabs li.inactive a {
    color: #666;
}

ul.tabs li.active a {
    color: black;
}

dl.generic dd {
    margin-bottom: 1em;
}

.pari {
    color: olive;
}

.paro {
    color: maroon;
}

.comment {
    font-size: 80%;
    color: green;
    white-space: nowrap;
}

table.grid {
    border-collapse: collapse;
}

table.grid td {
    padding: 5px;
    border: 1px solid;
}

table.layout {
    border: 0px;
}

table.layout td {
    padding: 5px;
}

table.table {
    border-collapse: collapse;
}

table.table td {
    padding: 5px;
    border-left: 0px;
    border-right: 0px;
}

table.table tr:last-child {
    border-bottom: 1px solid;
}

table.table th {
    padding: 5px;
    border-top: 1px solid;
    border-bottom: 1px solid;
    border-left: 0px;
    border-right: 0px;
}

.details_summary {
    cursor: pointer;
}

table.toctable {
    width: 100%;
}

table.toctable col:first-child {
    width: 20%;
}

table.toctable col:nth-last-child(2) {
    width: 8%;
}

table.altcolored tr:nth-child(even) {
    background-color: #f3f3f3;
}

    </style>
<!--OP_REF_STYLE_END-->
<script>
    <!--
var active_lang='hdevelop';function switchVisibility(obj,active_lang,new_lang)
{var display_style='inline';
for(var i=0;i<obj.length;i++)
{if(obj.item(i).getAttribute('data-if')==new_lang)
{obj.item(i).style.display=display_style;}
if(obj.item(i).getAttribute('data-if')==active_lang)
{obj.item(i).style.display='none';}}
return;}
function toggleLanguage(new_lang,initial)
{if(active_lang!=new_lang)
{var lis=document.getElementsByTagName('li');for(var i=0;i<lis.length;i++)
{if(lis.item(i).id=='syn-'+new_lang)
{lis.item(i).className='active';}
else
{lis.item(i).className='inactive';}}
var divs=document.getElementsByTagName('div');var spans=document.getElementsByTagName('span');switchVisibility(divs,active_lang,new_lang);switchVisibility(spans,active_lang,new_lang);if(!initial)
{setCookie("halcon_reference_language",new_lang,null,null);}
active_lang=new_lang;}
return;}
function setCookie(name,value,domain,exp_offset,path,secure)
{localStorage.setItem(name,value);}
function getCookie(name)
{return localStorage.getItem(name);}
function initialize()
{var qs=location.href.split('?')[1];var qs_lang_raw=location.href.split('interface=')[1];var qs_lang;if(qs_lang_raw)
{qs_lang=qs_lang_raw.split('#')[0];}
var cookie_lang=getCookie("halcon_reference_language");var new_lang;if((qs_lang=="hdevelop")||(qs_lang=="dotnet")||(qs_lang=="python")||(qs_lang=="cpp")||(qs_lang=="c"))
{new_lang=qs_lang;setCookie("halcon_reference_language",new_lang,null,null);}
else if((cookie_lang=="hdevelop")||(cookie_lang=="dotnet")||(cookie_lang=="python")||(cookie_lang=="cpp")||(cookie_lang=="c"))
{new_lang=cookie_lang;}
else
{new_lang="hdevelop";}
toggleLanguage(new_lang,1);return;}
-->

  </script>
</head>
<body onload="initialize();">
<div class="breadcrumb">
<br class="inv"><a href="index.html">目录</a> / <a href="toc_3dreconstruction.html">3D Reconstruction</a> / <a href="toc_3dreconstruction_photometricstereo.html">Photometric Stereo</a><br class="inv">
</div>
<div class="body_main">
<div class="tabbar"><ul class="tabs">
<li id="syn-hdevelop" class="active"><a href="javascript:void(0);" onclick="toggleLanguage('hdevelop')" onfocus="blur()">HDevelop</a></li>
<li id="syn-dotnet" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('dotnet')" onfocus="blur()">.NET</a></li>
<li id="syn-python" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('python')" onfocus="blur()">Python</a></li>
<li id="syn-cpp" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('cpp')" onfocus="blur()">C++</a></li>
<li id="syn-c" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('c')" onfocus="blur()">C</a></li>
</ul></div>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<!--OP_REF_HEADER_END-->
<h1 id="sec_name">
<span data-if="hdevelop" style="display:inline;">photometric_stereo</span><span data-if="c" style="display:none;">T_photometric_stereo</span><span data-if="cpp" style="display:none;">PhotometricStereo</span><span data-if="dotnet" style="display:none;">PhotometricStereo</span><span data-if="python" style="display:none;">photometric_stereo</span> (算子名称)</h1>
<h2>名称</h2>
<p><code><span data-if="hdevelop" style="display:inline;">photometric_stereo</span><span data-if="c" style="display:none;">T_photometric_stereo</span><span data-if="cpp" style="display:none;">PhotometricStereo</span><span data-if="dotnet" style="display:none;">PhotometricStereo</span><span data-if="python" style="display:none;">photometric_stereo</span></code> — Reconstruct a surface according to the photometric stereo technique.</p>
<h2 id="sec_synopsis">参数签名</h2>
<div data-if="hdevelop" style="display:inline;">
<p>
<code><b>photometric_stereo</b>(<a href="#Images"><i>Images</i></a> : <a href="#HeightField"><i>HeightField</i></a>, <a href="#Gradient"><i>Gradient</i></a>, <a href="#Albedo"><i>Albedo</i></a> : <a href="#Slants"><i>Slants</i></a>, <a href="#Tilts"><i>Tilts</i></a>, <a href="#ResultType"><i>ResultType</i></a>, <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, <a href="#GenParamName"><i>GenParamName</i></a>, <a href="#GenParamValue"><i>GenParamValue</i></a> : )</code></p>
</div>
<div data-if="c" style="display:none;">
<p>
<code>Herror <b>T_photometric_stereo</b>(const Hobject <a href="#Images"><i>Images</i></a>, Hobject* <a href="#HeightField"><i>HeightField</i></a>, Hobject* <a href="#Gradient"><i>Gradient</i></a>, Hobject* <a href="#Albedo"><i>Albedo</i></a>, const Htuple <a href="#Slants"><i>Slants</i></a>, const Htuple <a href="#Tilts"><i>Tilts</i></a>, const Htuple <a href="#ResultType"><i>ResultType</i></a>, const Htuple <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const Htuple <a href="#GenParamName"><i>GenParamName</i></a>, const Htuple <a href="#GenParamValue"><i>GenParamValue</i></a>)</code></p>
</div>
<div data-if="cpp" style="display:none;">
<p>
<code>void <b>PhotometricStereo</b>(const HObject&amp; <a href="#Images"><i>Images</i></a>, HObject* <a href="#HeightField"><i>HeightField</i></a>, HObject* <a href="#Gradient"><i>Gradient</i></a>, HObject* <a href="#Albedo"><i>Albedo</i></a>, const HTuple&amp; <a href="#Slants"><i>Slants</i></a>, const HTuple&amp; <a href="#Tilts"><i>Tilts</i></a>, const HTuple&amp; <a href="#ResultType"><i>ResultType</i></a>, const HTuple&amp; <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>)</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>::<b>PhotometricStereo</b>(HImage* <a href="#Gradient"><i>Gradient</i></a>, HImage* <a href="#Albedo"><i>Albedo</i></a>, const HTuple&amp; <a href="#Slants"><i>Slants</i></a>, const HTuple&amp; <a href="#Tilts"><i>Tilts</i></a>, const HTuple&amp; <a href="#ResultType"><i>ResultType</i></a>, const HString&amp; <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>) const</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>::<b>PhotometricStereo</b>(HImage* <a href="#Gradient"><i>Gradient</i></a>, HImage* <a href="#Albedo"><i>Albedo</i></a>, const HTuple&amp; <a href="#Slants"><i>Slants</i></a>, const HTuple&amp; <a href="#Tilts"><i>Tilts</i></a>, const HTuple&amp; <a href="#ResultType"><i>ResultType</i></a>, const char* <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>) const</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>::<b>PhotometricStereo</b>(HImage* <a href="#Gradient"><i>Gradient</i></a>, HImage* <a href="#Albedo"><i>Albedo</i></a>, const HTuple&amp; <a href="#Slants"><i>Slants</i></a>, const HTuple&amp; <a href="#Tilts"><i>Tilts</i></a>, const HTuple&amp; <a href="#ResultType"><i>ResultType</i></a>, const wchar_t* <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>) const  <span class="signnote">
            (
            Windows only)
          </span></code></p>
</div>
<div data-if="com" style="display:none;"></div>
<div data-if="dotnet" style="display:none;">
<p>
<code>static void <a href="HOperatorSet.html">HOperatorSet</a>.<b>PhotometricStereo</b>(<a href="HObject.html">HObject</a> <a href="#Images"><i>images</i></a>, out <a href="HObject.html">HObject</a> <a href="#HeightField"><i>heightField</i></a>, out <a href="HObject.html">HObject</a> <a href="#Gradient"><i>gradient</i></a>, out <a href="HObject.html">HObject</a> <a href="#Albedo"><i>albedo</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Slants"><i>slants</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Tilts"><i>tilts</i></a>, <a href="HTuple.html">HTuple</a> <a href="#ResultType"><i>resultType</i></a>, <a href="HTuple.html">HTuple</a> <a href="#ReconstructionMethod"><i>reconstructionMethod</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamName"><i>genParamName</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamValue"><i>genParamValue</i></a>)</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>.<b>PhotometricStereo</b>(out <a href="HImage.html">HImage</a> <a href="#Gradient"><i>gradient</i></a>, out <a href="HImage.html">HImage</a> <a href="#Albedo"><i>albedo</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Slants"><i>slants</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Tilts"><i>tilts</i></a>, <a href="HTuple.html">HTuple</a> <a href="#ResultType"><i>resultType</i></a>, string <a href="#ReconstructionMethod"><i>reconstructionMethod</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamName"><i>genParamName</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamValue"><i>genParamValue</i></a>)</code></p>
</div>
<div data-if="python" style="display:none;">
<p>
<code>def <b>photometric_stereo</b>(<a href="#Images"><i>images</i></a>: HObject, <a href="#Slants"><i>slants</i></a>: Sequence[Union[float, int]], <a href="#Tilts"><i>tilts</i></a>: Sequence[Union[float, int]], <a href="#ResultType"><i>result_type</i></a>: Sequence[str], <a href="#ReconstructionMethod"><i>reconstruction_method</i></a>: str, <a href="#GenParamName"><i>gen_param_name</i></a>: Sequence[str], <a href="#GenParamValue"><i>gen_param_value</i></a>: Sequence[Union[int, float, str]]) -&gt; Tuple[HObject, HObject, HObject]</code></p>
</div>
<h2 id="sec_description">描述</h2>
<p><code><span data-if="hdevelop" style="display:inline">photometric_stereo</span><span data-if="c" style="display:none">photometric_stereo</span><span data-if="cpp" style="display:none">PhotometricStereo</span><span data-if="com" style="display:none">PhotometricStereo</span><span data-if="dotnet" style="display:none">PhotometricStereo</span><span data-if="python" style="display:none">photometric_stereo</span></code> can be used to separate the three-dimensional shape
of an object from its two-dimensional texture, e.g., its print image. The
operator requires at least three images of the same object taken with
different and known directions of illumination. Note, that the point of view
of the camera must be the same for all images.
</p>
<p>The three-dimensional shape of the object is primarily computed as the local
gradients of the three-dimensional surface. Those gradients can be further
integrated to obtain a height field, i.e., an image in which the pixel values
correspond to a relative height.  The two-dimensional texture is called
albedo and corresponds to the local light absorption and reflection
characteristics of the surface exclusive of any shading effect.
</p>
<p><b>Typical applications of photometric stereo</b>
</p>
<p>Typical applications of photometric stereo are to detect small
inconsistencies in a surface that represent, e.g., defects, or to exclude the
influence of the direction of light from images that are used, e.g., for the
print inspection of non flat characters. Note that photometric stereo is not
suitable for the reconstruction of absolute heights, i.e., it is no
alternative to typical 3D reconstruction algorithms like depth from focus
or sheet of light.
</p>
<p><b>Limitations of photometric stereo</b>
</p>
<p><code><span data-if="hdevelop" style="display:inline">photometric_stereo</span><span data-if="c" style="display:none">photometric_stereo</span><span data-if="cpp" style="display:none">PhotometricStereo</span><span data-if="com" style="display:none">PhotometricStereo</span><span data-if="dotnet" style="display:none">PhotometricStereo</span><span data-if="python" style="display:none">photometric_stereo</span></code> is based on the algorithm of Woodham and
therefore assumes on the one hand that the camera performs an orthoscopic
projection. That is, you must use a telecentric lens or a lens with a long
focal distance. On the other hand, it assumes that each of the light sources
delivers a parallel and uniform beam of light. That is, you must use
telecentric illumination sources with uniform intensity or, as an
alternative, distant point light sources.  Additionally, the object must have
Lambertian reflectance characteristics, i.e., it must reflect incoming light
in a diffuse way. Objects or regions of an object that have specular
reflectance characteristics (i.e., mirroring or glossy surfaces) cannot be
processed correctly and thus lead to erroneous results.
</p>
<p><b>The acquisition setup</b>
</p>
<p>The camera with a telecentric lens must be placed orthogonally, i.e.,
perpendicular, to the scene that should be reconstructed. The orientation of
the camera with respect to the scene must not change during the acquisition
of the images. In contrast, the orientation of the illumination with respect
to the camera must change for at least three gray value images.
</p>
<p><b>Specifying the directions of illumination</b>
</p>
<p>For each image, the directions of illumination must be specified as angles
within the parameters <a href="#Slants"><i><code><span data-if="hdevelop" style="display:inline">Slants</span><span data-if="c" style="display:none">Slants</span><span data-if="cpp" style="display:none">Slants</span><span data-if="com" style="display:none">Slants</span><span data-if="dotnet" style="display:none">slants</span><span data-if="python" style="display:none">slants</span></code></i></a> and <a href="#Tilts"><i><code><span data-if="hdevelop" style="display:inline">Tilts</span><span data-if="c" style="display:none">Tilts</span><span data-if="cpp" style="display:none">Tilts</span><span data-if="com" style="display:none">Tilts</span><span data-if="dotnet" style="display:none">tilts</span><span data-if="python" style="display:none">tilts</span></code></i></a>, which describe the
direction of the illumination in relation to the scene. To understand the
meaning of the parameters <a href="#Slants"><i><code><span data-if="hdevelop" style="display:inline">Slants</span><span data-if="c" style="display:none">Slants</span><span data-if="cpp" style="display:none">Slants</span><span data-if="com" style="display:none">Slants</span><span data-if="dotnet" style="display:none">slants</span><span data-if="python" style="display:none">slants</span></code></i></a> and <a href="#Tilts"><i><code><span data-if="hdevelop" style="display:inline">Tilts</span><span data-if="c" style="display:none">Tilts</span><span data-if="cpp" style="display:none">Tilts</span><span data-if="com" style="display:none">Tilts</span><span data-if="dotnet" style="display:none">tilts</span><span data-if="python" style="display:none">tilts</span></code></i></a>, remember that
the illumination source is assumed to produce parallel light rays, the camera
has a telecentric lens, and the camera is placed orthogonal to the scene to
reconstruct:
</p>
<dl class="generic">

<dt><b><a href="#Slants"><i><code><span data-if="hdevelop" style="display:inline">Slants</span><span data-if="c" style="display:none">Slants</span><span data-if="cpp" style="display:none">Slants</span><span data-if="com" style="display:none">Slants</span><span data-if="dotnet" style="display:none">slants</span><span data-if="python" style="display:none">slants</span></code></i></a></b></dt>
<dd>
<p>

The <a href="#Slants"><i><code><span data-if="hdevelop" style="display:inline">Slants</span><span data-if="c" style="display:none">Slants</span><span data-if="cpp" style="display:none">Slants</span><span data-if="com" style="display:none">Slants</span><span data-if="dotnet" style="display:none">slants</span><span data-if="python" style="display:none">slants</span></code></i></a> angle is the angle between the optical
axis of the camera and the direction of the illumination.
</p>
<div style="text-align:center;" class="figure">
<svg xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="122.46961mm" height="92.05442mm" viewBox="0 0 867.89489 652.35415" id="svg2" version="1.1" customscale="0.5">
  <defs id="defs4">
    <marker orient="auto" refY="0" refX="0" id="marker6100" style="overflow:visible">
      <path id="path6102" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" transform="scale(-0.6,-0.6)"></path>
    </marker>
    <marker style="overflow:visible" id="marker5295" refX="0" refY="0" orient="auto">
      <path transform="scale(0.6,0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4204"></path>
    </marker>
    <linearGradient id="linearGradient9760" osb:paint="gradient">
      <stop style="stop-color:#000000;stop-opacity:0.78571427;" offset="0" id="stop9762"></stop>
      <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop9764"></stop>
    </linearGradient>
    <marker orient="auto" refY="0" refX="0" id="Arrow2Mend" style="overflow:visible">
      <path id="path5744" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" transform="scale(-0.6,-0.6)"></path>
    </marker>
    <marker orient="auto" refY="0" refX="0" id="Arrow2Mstart" style="overflow:visible">
      <path id="path5741" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" transform="scale(0.6,0.6)"></path>
    </marker>
    <linearGradient id="linearGradient5628">
      <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop5630"></stop>
    </linearGradient>
    <linearGradient id="linearGradient5622" osb:paint="solid">
      <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop5624"></stop>
    </linearGradient>
    <linearGradient id="linearGradient5616" osb:paint="solid">
      <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop5618"></stop>
    </linearGradient>
    <linearGradient id="linearGradient5610" osb:paint="solid">
      <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop5612"></stop>
    </linearGradient>
    <linearGradient id="linearGradient5602" osb:paint="solid">
      <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop5604"></stop>
    </linearGradient>
    <linearGradient id="linearGradient4148" osb:paint="gradient">
      <stop id="stop4162" offset="0" style="stop-color:#000000;stop-opacity:1;"></stop>
      <stop id="stop4164" offset="1" style="stop-color:#000000;stop-opacity:0;"></stop>
    </linearGradient>
    <linearGradient id="linearGradient4166" osb:paint="gradient">
      <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop4150"></stop>
      <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop4152"></stop>
    </linearGradient>
    <linearGradient xlink:href="#linearGradient4148" id="linearGradient9774" x1="609.11389" y1="1063.3827" x2="469.89694" y2="930.04242" gradientUnits="userSpaceOnUse"></linearGradient>
    <marker style="overflow:visible" id="marker6055-9-1" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3"></path>
    </marker>
    <marker style="overflow:visible" id="marker6055-9-1-0" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3-0"></path>
    </marker>
    <marker style="overflow:visible" id="marker6055-9-1-4" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3-2"></path>
    </marker>
    <marker style="overflow:visible" id="marker6055-9-1-3" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3-7"></path>
    </marker>
    <marker style="overflow:visible" id="marker6055-9-1-6" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3-4"></path>
    </marker>
    <marker style="overflow:visible" id="marker6055-9-1-0-4" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3-0-9"></path>
    </marker>
    <marker style="overflow:visible" id="marker6055-9-1-4-7" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3-2-2"></path>
    </marker>
    <marker style="overflow:visible" id="marker6055-9-1-3-4" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path4207-9-3-7-4"></path>
    </marker>
  </defs>
  <metadata id="metadata7">
    <rdf:RDF>
      <cc:Work rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"></dc:type>
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g id="layer1" transform="translate(-83.520134,-351.43362)">
    <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 196.83107,1002.2878 754.58395,0" id="path3336"></path>
    <path style="fill:url(#linearGradient9774);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path4138" d="m 441.42856,1002.2194 a 104.64285,67.582306 0 0 1 104.64285,-67.58228 104.64285,67.582306 0 0 1 104.64285,67.58228 l -104.64285,0 z"></path>
    <path style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path5636" d="m 628.17246,595.44907 -82.10102,0 -82.10101,0 41.0505,-107.31449 41.05051,-107.31451 41.05051,107.31449 z"></path>
    <g id="g5671" transform="translate(34.64286,155.71429)">
      <circle r="47.349625" cy="443.15985" cx="98.726898" id="path5644" style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"></circle>
      <g transform="translate(-29.219533,-131.25592)" id="g5667">
        <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 94.91072,607.45149 66.07142,-66.07143" id="path5650"></path>
        <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 160.98215,607.45149 94.910712,541.38006" id="path5650-0"></path>
      </g>
    </g>
    <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.52620721;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:14.10482923, 14.10482923;stroke-dashoffset:0;stroke-opacity:1" d="m 546.23408,595.31954 0,407.17266" id="path5694"></path>
    <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:12, 12;stroke-dashoffset:0;stroke-opacity:1" d="M 132.85714,598.07649 546.0931,1002.153" id="path5694-2"></path>
    <path style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend)" id="path5711" d="m 357.10792,802.28548 a 274.39719,274.39719 0 0 1 177.0741,-75.47713"></path>
    <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" x="80.76413" y="847.9151" id="text6693" transform="matrix(0.93076704,-0.36561279,0.36561279,0.93076704,0,0)"><tspan id="tspan6695" x="80.76413" y="847.9151">Slant</tspan></text>
    <rect style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect5634" width="125.71429" height="122.85715" x="483.21429" y="353.93362" rx="0.59357661"></rect>
    <g id="g9757">
      <path id="path5694-2-5-6-8" d="m 522.81812,697.16269 -0.98605,-87.98675" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1)"></path>
      <path id="path5694-2-5-6-8-8" d="M 572.12495,697.16269 571.1389,609.17594" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1-0)"></path>
      <path id="path5694-2-5-6-8-4" d="m 491.51123,697.16269 -0.98605,-87.98675" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1-4)"></path>
      <path id="path5694-2-5-6-8-7" d="m 603.43184,697.16269 -0.98605,-87.98675" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1-3)"></path>
    </g>
    <g id="g9757-5" transform="matrix(-0.70704273,0.70717083,-0.70717083,-0.70704273,1055.5411,744.72322)">
      <path id="path5694-2-5-6-8-6" d="m 522.81812,697.16269 -0.98605,-87.98675" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1-6)"></path>
      <path id="path5694-2-5-6-8-8-3" d="M 572.12495,697.16269 571.1389,609.17594" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1-0-4)"></path>
      <path id="path5694-2-5-6-8-4-5" d="m 491.51123,697.16269 -0.98605,-87.98675" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1-4-7)"></path>
      <path id="path5694-2-5-6-8-7-9" d="m 603.43184,697.16269 -0.98605,-87.98675" style="fill:none;fill-rule:evenodd;stroke:#808080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker6055-9-1-3-4)"></path>
    </g>
  </g>
</svg><div style="margin-bottom:30px;text-align:center;" class="caption">Side view
</div>
</div>
</dd>

<dt><b><a href="#Tilts"><i><code><span data-if="hdevelop" style="display:inline">Tilts</span><span data-if="c" style="display:none">Tilts</span><span data-if="cpp" style="display:none">Tilts</span><span data-if="com" style="display:none">Tilts</span><span data-if="dotnet" style="display:none">tilts</span><span data-if="python" style="display:none">tilts</span></code></i></a></b></dt>
<dd>
<p>

The <a href="#Tilts"><i><code><span data-if="hdevelop" style="display:inline">Tilts</span><span data-if="c" style="display:none">Tilts</span><span data-if="cpp" style="display:none">Tilts</span><span data-if="com" style="display:none">Tilts</span><span data-if="dotnet" style="display:none">tilts</span><span data-if="python" style="display:none">tilts</span></code></i></a> angle is measured within the object plane or any plane
that is parallel to it, e.g., the image plane. In particular, it
describes the angle between the direction that points from the center
of the image to the right and the direction of light that is projected
into the plane. That is, when looking at the image (or the
corresponding scene), a tilt angle of 0 means that the light comes from
the right, a tilt angle of 90 means that the light is coming from the
top, a tilt angle of 180 means that the light is coming from the left,
etc.
</p>
<div style="text-align:center;" class="figure">
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="svg6717" viewBox="0 0 664.69329 582.85482" height="82.24729mm" width="93.79561mm" customscale="0.5">
  <defs id="defs6719">
    <marker orient="auto" refY="0.0" refX="0.0" id="marker4503" style="overflow:visible">
      <path id="path4204" style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1" d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " transform="scale(0.6) translate(0,0)"></path>
    </marker>
    <linearGradient id="linearGradient9788">
      <stop id="stop9790" offset="0" style="stop-color:#000000;stop-opacity:1;"></stop>
      <stop id="stop9792" offset="1" style="stop-color:#000000;stop-opacity:0;"></stop>
    </linearGradient>
    <marker style="overflow:visible" id="Arrow2Mstart" refX="0" refY="0" orient="auto">
      <path transform="scale(0.6,0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path5741"></path>
    </marker>
    <marker style="overflow:visible" id="Arrow2Mend" refX="0" refY="0" orient="auto">
      <path transform="scale(-0.6,-0.6)" d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" id="path5744"></path>
    </marker>
    <linearGradient gradientUnits="userSpaceOnUse" y2="708.49683" x2="502.58014" y1="553.25104" x1="630.25714" id="linearGradient9796" xlink:href="#linearGradient9788"></linearGradient>
  </defs>
  <metadata id="metadata6722">
    <rdf:RDF>
      <cc:Work rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"></dc:type>
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g transform="translate(-214.6801,-353.33664)" id="layer1">
    <g transform="translate(256.02587,443.18199)" id="g5671">
      <circle style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path5644" cx="98.726898" cy="443.15985" r="47.349625"></circle>
      <g id="g5667" transform="translate(-29.219533,-131.25592)">
        <path id="path5650" d="m 94.91072,607.45149 66.07142,-66.07143" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"></path>
        <path id="path5650-0" d="M 160.98215,607.45149 94.910712,541.38006" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"></path>
      </g>
    </g>
    <path id="path6754" d="m 563.66511,353.33664 0,561.64482" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"></path>
    <path id="path6754-4" d="m 844.48752,634.15905 -561.64482,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.5"></path>
    <ellipse ry="67.582306" rx="104.64285" cy="634.15906" cx="563.6651" id="path4138" style="fill:url(#linearGradient9796);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"></ellipse>
    <text id="text7328" y="646.28082" x="847.51794" style="font-style:normal;font-weight:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.5;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" xml:space="preserve"><tspan y="646.28082" x="847.51794" id="tspan7330" style="fill:#000000;fill-opacity:0.5;">0°</tspan></text>
    <text id="text7328-6" y="374.93896" x="572.58185" style="font-style:normal;font-weight:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.5;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" xml:space="preserve"><tspan y="374.93896" x="572.58185" id="tspan7330-4" style="fill:#000000;fill-opacity:0.5;">90°</tspan></text>
    <text id="text7328-9" y="644.64972" x="210.94719" style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.5;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" xml:space="preserve"><tspan style="font-size:27.5px;fill:#000000;fill-opacity:0.5;" y="644.64972" x="210.94719" id="tspan7330-3">180°</tspan></text>
    <text id="text7328-9-5" y="912.34015" x="572.58179" style="font-style:normal;font-weight:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.5;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" xml:space="preserve"><tspan y="912.34015" x="572.58179" id="tspan7330-3-4" style="fill:#000000;fill-opacity:0.5;">270°</tspan></text>
    <path id="path5694" d="M 355.64565,886.084 563.12941,634.83532" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.316257;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:13.26502826, 13.26502826;stroke-dashoffset:0;stroke-opacity:1"></path>
    <text transform="matrix(0.88437406,-0.46677888,0.46677888,0.88437406,0,0)" id="text6693" y="610.61786" x="167.89185" style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" xml:space="preserve"><tspan y="610.61786" x="167.89185" id="tspan6695">Tilt</tspan></text>
    <path style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.72300005;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#marker4503)" id="path4501" d="M 425.92691,786.69598 A 206.22194,206.22194 0 0 1 382.25356,536.47713 206.22194,206.22194 0 0 1 614.52232,433.67605 206.22194,206.22194 0 0 1 770.36707,634.24836"></path>
  </g>
</svg><div style="margin-bottom:30px;text-align:center;" class="caption">Top view
</div>
</div>
</dd>
</dl>
<p>As stated before, photometric stereo requires at least three images with
different directions of illumination. However, the three-dimensional geometry
of objects typically leads to shadow casting. In the shadow regions, the
number of effectively available directions of illumination is reduced, which
leads to ambiguities.  To nevertheless get a robust result, redundancy is
needed. Therefore, typically more than three light sources with different
directions should be used. But note that an increasing number of illumination
directions also leads to a higher number of images to be processed and
therefore to a higher processing time.  In most applications, a number of
four to six light sources is reasonable.  As a rule of thumb, the slant angles
should be chosen between 30° and 60°.  The tilt angles typically should be
equally distributed around the object to be measured.  Please note that the
directions of illumination must be selected such that they do not lie in the
same plane (i.e., the illumination directions must be independent), otherwise
the computing fails and an exception is thrown.
</p>
<p><b>Input images and domains of definition</b>
</p>
<p>The input images must be provided in an image array (<a href="#Images"><i><code><span data-if="hdevelop" style="display:inline">Images</span><span data-if="c" style="display:none">Images</span><span data-if="cpp" style="display:none">Images</span><span data-if="com" style="display:none">Images</span><span data-if="dotnet" style="display:none">images</span><span data-if="python" style="display:none">images</span></code></i></a>). Each
image must have been taken with a different direction of illumination as
stated above. If the images are primarily stored in a multi-channel image,
they can be easily converted to an image array using
<a href="image_to_channels.html"><code><span data-if="hdevelop" style="display:inline">image_to_channels</span><span data-if="c" style="display:none">image_to_channels</span><span data-if="cpp" style="display:none">ImageToChannels</span><span data-if="com" style="display:none">ImageToChannels</span><span data-if="dotnet" style="display:none">ImageToChannels</span><span data-if="python" style="display:none">image_to_channels</span></code></a>. As an alternative, the image array can be created
using <a href="concat_obj.html"><code><span data-if="hdevelop" style="display:inline">concat_obj</span><span data-if="c" style="display:none">concat_obj</span><span data-if="cpp" style="display:none">ConcatObj</span><span data-if="com" style="display:none">ConcatObj</span><span data-if="dotnet" style="display:none">ConcatObj</span><span data-if="python" style="display:none">concat_obj</span></code></a>.
</p>
<p><code><span data-if="hdevelop" style="display:inline">photometric_stereo</span><span data-if="c" style="display:none">photometric_stereo</span><span data-if="cpp" style="display:none">PhotometricStereo</span><span data-if="com" style="display:none">PhotometricStereo</span><span data-if="dotnet" style="display:none">PhotometricStereo</span><span data-if="python" style="display:none">photometric_stereo</span></code> relies on the evaluation of the "photometric
information", i.e., the gray values stored in the images. Therefore, this
information should be unbiased and accurate. We recommend to ensure that the
camera that is used to acquire the images has a linear characteristic. You
can use 该算子 <a href="radiometric_self_calibration.html"><code><span data-if="hdevelop" style="display:inline">radiometric_self_calibration</span><span data-if="c" style="display:none">radiometric_self_calibration</span><span data-if="cpp" style="display:none">RadiometricSelfCalibration</span><span data-if="com" style="display:none">RadiometricSelfCalibration</span><span data-if="dotnet" style="display:none">RadiometricSelfCalibration</span><span data-if="python" style="display:none">radiometric_self_calibration</span></code></a> to determine the
characteristic of your camera and 该算子 <a href="lut_trans.html"><code><span data-if="hdevelop" style="display:inline">lut_trans</span><span data-if="c" style="display:none">lut_trans</span><span data-if="cpp" style="display:none">LutTrans</span><span data-if="com" style="display:none">LutTrans</span><span data-if="dotnet" style="display:none">LutTrans</span><span data-if="python" style="display:none">lut_trans</span></code></a> to correct
the gray value information in case of a non linear
characteristic. Additionally, if accurate measurements are required, we
recommend to utilize the full dynamic range of the camera since this leads to
more accurate gray value information. For the same reason, using images with
a bit depth higher than 8 (e.g., uint2 images instead of byte images) leads
to a better accuracy.
</p>
<p>The domain of definition of the input images determines which algorithm is
used internally to process the <a href="#Images"><i><code><span data-if="hdevelop" style="display:inline">Images</span><span data-if="c" style="display:none">Images</span><span data-if="cpp" style="display:none">Images</span><span data-if="com" style="display:none">Images</span><span data-if="dotnet" style="display:none">images</span><span data-if="python" style="display:none">images</span></code></i></a>. Three algorithms are
available:
</p>
<ul>
<li>
<p>
If all images have a full domain, the fastest algorithm is used. This
mode is recommended for most applications.
</p>
</li>
<li>
<p>
If the input images share the same reduced domain of definition, only the
pixels within the domain are processed. This mode can be used to exclude
areas of the object from all images. Typically, areas are excluded that
are known to show non-Lambertian reflectance characteristics or that are
of no interest, e.g., holes in the surface.
</p>
</li>
<li>
<p>
If images with distinct domains of definition are provided, only the gray
values that are contained in the domains are used in the respective
images. Then, only those pixels are processed that have independent slant
and tilt angles in at least three images. This mode is suitable, e.g., to
exclude specific regions of individual images from the processing. These
can be, e.g., areas of the object for which is known that they show
non-Lambertian reflectance characteristics or regions for which is known
that they contain biased photometric information, e.g., shadows. To
exclude such regions leads to more accurate results. Please note that
this last mode requires significantly more processing time than the modes
that use the full domain or the same domain for all images.
</p>
</li>
</ul>
<p><b>Output images</b>
</p>
<p>该算子 can return the images for the reconstructed <a href="#Gradient"><i><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></i></a>, <a href="#Albedo"><i><code><span data-if="hdevelop" style="display:inline">Albedo</span><span data-if="c" style="display:none">Albedo</span><span data-if="cpp" style="display:none">Albedo</span><span data-if="com" style="display:none">Albedo</span><span data-if="dotnet" style="display:none">albedo</span><span data-if="python" style="display:none">albedo</span></code></i></a>,
and the <a href="#HeightField"><i><code><span data-if="hdevelop" style="display:inline">HeightField</span><span data-if="c" style="display:none">HeightField</span><span data-if="cpp" style="display:none">HeightField</span><span data-if="com" style="display:none">HeightField</span><span data-if="dotnet" style="display:none">heightField</span><span data-if="python" style="display:none">height_field</span></code></i></a> of the surface:
</p>
<ul>
<li>
<p>
The <a href="#Gradient"><i><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></i></a> image is a vector field that contains the
partial derivative of the surface. Note that <a href="#Gradient"><i><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></i></a> can be
used as input to <a href="reconstruct_height_field_from_gradient.html"><code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code></a>.  For
visualization purposes, instead of the surface gradients normalized
surface normals can be returned. Then, <a href="#ResultType"><i><code><span data-if="hdevelop" style="display:inline">ResultType</span><span data-if="c" style="display:none">ResultType</span><span data-if="cpp" style="display:none">ResultType</span><span data-if="com" style="display:none">ResultType</span><span data-if="dotnet" style="display:none">resultType</span><span data-if="python" style="display:none">result_type</span></code></i></a> must be
set to <i><span data-if="hdevelop" style="display:inline">'normalized_surface_normal'</span><span data-if="c" style="display:none">"normalized_surface_normal"</span><span data-if="cpp" style="display:none">"normalized_surface_normal"</span><span data-if="com" style="display:none">"normalized_surface_normal"</span><span data-if="dotnet" style="display:none">"normalized_surface_normal"</span><span data-if="python" style="display:none">"normalized_surface_normal"</span></i>
(legacy: <i><span data-if="hdevelop" style="display:inline">'normalized_gradient'</span><span data-if="c" style="display:none">"normalized_gradient"</span><span data-if="cpp" style="display:none">"normalized_gradient"</span><span data-if="com" style="display:none">"normalized_gradient"</span><span data-if="dotnet" style="display:none">"normalized_gradient"</span><span data-if="python" style="display:none">"normalized_gradient"</span></i>) instead of
<i><span data-if="hdevelop" style="display:inline">'gradient'</span><span data-if="c" style="display:none">"gradient"</span><span data-if="cpp" style="display:none">"gradient"</span><span data-if="com" style="display:none">"gradient"</span><span data-if="dotnet" style="display:none">"gradient"</span><span data-if="python" style="display:none">"gradient"</span></i>. Here, the row and column components represent the
row and column components of the normalized surface normal. If
<a href="#ResultType"><i><code><span data-if="hdevelop" style="display:inline">ResultType</span><span data-if="c" style="display:none">ResultType</span><span data-if="cpp" style="display:none">ResultType</span><span data-if="com" style="display:none">ResultType</span><span data-if="dotnet" style="display:none">resultType</span><span data-if="python" style="display:none">result_type</span></code></i></a> is set to <i><span data-if="hdevelop" style="display:inline">'all'</span><span data-if="c" style="display:none">"all"</span><span data-if="cpp" style="display:none">"all"</span><span data-if="com" style="display:none">"all"</span><span data-if="dotnet" style="display:none">"all"</span><span data-if="python" style="display:none">"all"</span></i>, the default mode, i.e.,
<i><span data-if="hdevelop" style="display:inline">'gradient'</span><span data-if="c" style="display:none">"gradient"</span><span data-if="cpp" style="display:none">"gradient"</span><span data-if="com" style="display:none">"gradient"</span><span data-if="dotnet" style="display:none">"gradient"</span><span data-if="python" style="display:none">"gradient"</span></i> and not <i><span data-if="hdevelop" style="display:inline">'normalized_surface_normal'</span><span data-if="c" style="display:none">"normalized_surface_normal"</span><span data-if="cpp" style="display:none">"normalized_surface_normal"</span><span data-if="com" style="display:none">"normalized_surface_normal"</span><span data-if="dotnet" style="display:none">"normalized_surface_normal"</span><span data-if="python" style="display:none">"normalized_surface_normal"</span></i> is used.
</p>
</li>
<li>
<p>
The <a href="#Albedo"><i><code><span data-if="hdevelop" style="display:inline">Albedo</span><span data-if="c" style="display:none">Albedo</span><span data-if="cpp" style="display:none">Albedo</span><span data-if="com" style="display:none">Albedo</span><span data-if="dotnet" style="display:none">albedo</span><span data-if="python" style="display:none">albedo</span></code></i></a> image describes the ratio of reflected radiation
to incident radiation and has a value between one (white surface) and
zero (black surface). Thus, the albedo is a characteristic of the
surface. For example, for a printed surface it corresponds to the
print image exclusive of any influences of the incident light
(shading).
</p>
</li>
<li>
<p>
The <a href="#HeightField"><i><code><span data-if="hdevelop" style="display:inline">HeightField</span><span data-if="c" style="display:none">HeightField</span><span data-if="cpp" style="display:none">HeightField</span><span data-if="com" style="display:none">HeightField</span><span data-if="dotnet" style="display:none">heightField</span><span data-if="python" style="display:none">height_field</span></code></i></a> image is an image in which the pixel values
correspond to a relative height.
</p>
</li>
</ul>
<p>By default, all of these iconic objects are returned, i.e., the parameter
<a href="#ResultType"><i><code><span data-if="hdevelop" style="display:inline">ResultType</span><span data-if="c" style="display:none">ResultType</span><span data-if="cpp" style="display:none">ResultType</span><span data-if="com" style="display:none">ResultType</span><span data-if="dotnet" style="display:none">resultType</span><span data-if="python" style="display:none">result_type</span></code></i></a> is set to <i><span data-if="hdevelop" style="display:inline">'all'</span><span data-if="c" style="display:none">"all"</span><span data-if="cpp" style="display:none">"all"</span><span data-if="com" style="display:none">"all"</span><span data-if="dotnet" style="display:none">"all"</span><span data-if="python" style="display:none">"all"</span></i>. In case that only some of these
results are needed, the parameter <a href="#ResultType"><i><code><span data-if="hdevelop" style="display:inline">ResultType</span><span data-if="c" style="display:none">ResultType</span><span data-if="cpp" style="display:none">ResultType</span><span data-if="com" style="display:none">ResultType</span><span data-if="dotnet" style="display:none">resultType</span><span data-if="python" style="display:none">result_type</span></code></i></a> can be set to a tuple
specifying only the required results among the values <i><span data-if="hdevelop" style="display:inline">'gradient'</span><span data-if="c" style="display:none">"gradient"</span><span data-if="cpp" style="display:none">"gradient"</span><span data-if="com" style="display:none">"gradient"</span><span data-if="dotnet" style="display:none">"gradient"</span><span data-if="python" style="display:none">"gradient"</span></i>,
<i><span data-if="hdevelop" style="display:inline">'albedo'</span><span data-if="c" style="display:none">"albedo"</span><span data-if="cpp" style="display:none">"albedo"</span><span data-if="com" style="display:none">"albedo"</span><span data-if="dotnet" style="display:none">"albedo"</span><span data-if="python" style="display:none">"albedo"</span></i>, and <i><span data-if="hdevelop" style="display:inline">'height_field'</span><span data-if="c" style="display:none">"height_field"</span><span data-if="cpp" style="display:none">"height_field"</span><span data-if="com" style="display:none">"height_field"</span><span data-if="dotnet" style="display:none">"height_field"</span><span data-if="python" style="display:none">"height_field"</span></i>.  Note that in certain
applications like surface inspection tasks only the <a href="#Gradient"><i><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></i></a> or
<a href="#Albedo"><i><code><span data-if="hdevelop" style="display:inline">Albedo</span><span data-if="c" style="display:none">Albedo</span><span data-if="cpp" style="display:none">Albedo</span><span data-if="com" style="display:none">Albedo</span><span data-if="dotnet" style="display:none">albedo</span><span data-if="python" style="display:none">albedo</span></code></i></a> images are required. Here, one can significantly increase the
processing speed by not reconstructing the surface, i.e., by passing only
<i><span data-if="hdevelop" style="display:inline">'gradient'</span><span data-if="c" style="display:none">"gradient"</span><span data-if="cpp" style="display:none">"gradient"</span><span data-if="com" style="display:none">"gradient"</span><span data-if="dotnet" style="display:none">"gradient"</span><span data-if="python" style="display:none">"gradient"</span></i> and <i><span data-if="hdevelop" style="display:inline">'albedo'</span><span data-if="c" style="display:none">"albedo"</span><span data-if="cpp" style="display:none">"albedo"</span><span data-if="com" style="display:none">"albedo"</span><span data-if="dotnet" style="display:none">"albedo"</span><span data-if="python" style="display:none">"albedo"</span></i> but not <i><span data-if="hdevelop" style="display:inline">'height_field'</span><span data-if="c" style="display:none">"height_field"</span><span data-if="cpp" style="display:none">"height_field"</span><span data-if="com" style="display:none">"height_field"</span><span data-if="dotnet" style="display:none">"height_field"</span><span data-if="python" style="display:none">"height_field"</span></i> to
<a href="#ResultType"><i><code><span data-if="hdevelop" style="display:inline">ResultType</span><span data-if="c" style="display:none">ResultType</span><span data-if="cpp" style="display:none">ResultType</span><span data-if="com" style="display:none">ResultType</span><span data-if="dotnet" style="display:none">resultType</span><span data-if="python" style="display:none">result_type</span></code></i></a>.
</p>
<p>Note that internally <code><span data-if="hdevelop" style="display:inline">photometric_stereo</span><span data-if="c" style="display:none">photometric_stereo</span><span data-if="cpp" style="display:none">PhotometricStereo</span><span data-if="com" style="display:none">PhotometricStereo</span><span data-if="dotnet" style="display:none">PhotometricStereo</span><span data-if="python" style="display:none">photometric_stereo</span></code> first determines the gradient
values and, if required, integrates these values in order to obtain the
height field. This integration is performed by the same algorithms that are
provided by 该算子 <a href="reconstruct_height_field_from_gradient.html"><code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code></a> and
that can be controlled by the parameters <a href="#ReconstructionMethod"><i><code><span data-if="hdevelop" style="display:inline">ReconstructionMethod</span><span data-if="c" style="display:none">ReconstructionMethod</span><span data-if="cpp" style="display:none">ReconstructionMethod</span><span data-if="com" style="display:none">ReconstructionMethod</span><span data-if="dotnet" style="display:none">reconstructionMethod</span><span data-if="python" style="display:none">reconstruction_method</span></code></i></a>,
<a href="#GenParamName"><i><code><span data-if="hdevelop" style="display:inline">GenParamName</span><span data-if="c" style="display:none">GenParamName</span><span data-if="cpp" style="display:none">GenParamName</span><span data-if="com" style="display:none">GenParamName</span><span data-if="dotnet" style="display:none">genParamName</span><span data-if="python" style="display:none">gen_param_name</span></code></i></a>, and <a href="#GenParamValue"><i><code><span data-if="hdevelop" style="display:inline">GenParamValue</span><span data-if="c" style="display:none">GenParamValue</span><span data-if="cpp" style="display:none">GenParamValue</span><span data-if="com" style="display:none">GenParamValue</span><span data-if="dotnet" style="display:none">genParamValue</span><span data-if="python" style="display:none">gen_param_value</span></code></i></a>. Please, refer to the
operator <a href="reconstruct_height_field_from_gradient.html"><code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code></a> for more information
on these parameters. If <a href="#ResultType"><i><code><span data-if="hdevelop" style="display:inline">ResultType</span><span data-if="c" style="display:none">ResultType</span><span data-if="cpp" style="display:none">ResultType</span><span data-if="com" style="display:none">ResultType</span><span data-if="dotnet" style="display:none">resultType</span><span data-if="python" style="display:none">result_type</span></code></i></a> is set such that
<i><span data-if="hdevelop" style="display:inline">'height_field'</span><span data-if="c" style="display:none">"height_field"</span><span data-if="cpp" style="display:none">"height_field"</span><span data-if="com" style="display:none">"height_field"</span><span data-if="dotnet" style="display:none">"height_field"</span><span data-if="python" style="display:none">"height_field"</span></i> is not one of the results, the parameters
<a href="#ReconstructionMethod"><i><code><span data-if="hdevelop" style="display:inline">ReconstructionMethod</span><span data-if="c" style="display:none">ReconstructionMethod</span><span data-if="cpp" style="display:none">ReconstructionMethod</span><span data-if="com" style="display:none">ReconstructionMethod</span><span data-if="dotnet" style="display:none">reconstructionMethod</span><span data-if="python" style="display:none">reconstruction_method</span></code></i></a>, <a href="#GenParamName"><i><code><span data-if="hdevelop" style="display:inline">GenParamName</span><span data-if="c" style="display:none">GenParamName</span><span data-if="cpp" style="display:none">GenParamName</span><span data-if="com" style="display:none">GenParamName</span><span data-if="dotnet" style="display:none">genParamName</span><span data-if="python" style="display:none">gen_param_name</span></code></i></a>, and
<a href="#GenParamValue"><i><code><span data-if="hdevelop" style="display:inline">GenParamValue</span><span data-if="c" style="display:none">GenParamValue</span><span data-if="cpp" style="display:none">GenParamValue</span><span data-if="com" style="display:none">GenParamValue</span><span data-if="dotnet" style="display:none">genParamValue</span><span data-if="python" style="display:none">gen_param_value</span></code></i></a> are ignored.</p>
<h2 id="sec_attention">注意</h2>
<p>Note that <code><span data-if="hdevelop" style="display:inline">photometric_stereo</span><span data-if="c" style="display:none">photometric_stereo</span><span data-if="cpp" style="display:none">PhotometricStereo</span><span data-if="com" style="display:none">PhotometricStereo</span><span data-if="dotnet" style="display:none">PhotometricStereo</span><span data-if="python" style="display:none">photometric_stereo</span></code> assumes square pixels. Additionally, it
assumes that the heights are computed on a lattice with step width 1 in
object space. If this is not the case, i.e., if the pixel size of the camera
projected into the object space differs from 1, the returned height values
must be multiplied by the actual step width (value of the pixel size
projected into the object space). The size of the pixel in object space is
computed by dividing the size of the pixel in the camera by the magnification
of the (telecentric) lens. </p>
<h2 id="sec_execution">运行信息</h2>
<ul>
  <li>多线程类型:可重入(与非独占操作符并行运行)。</li>
<li>多线程作用域:全局(可以从任何线程调用)。</li>
  
    <li>Automatically parallelized on internal data level.</li>
  
</ul>
<h2 id="sec_parameters">参数表</h2>
  <div class="par">
<div class="parhead">
<span id="Images" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Images</span><span data-if="c" style="display:none">Images</span><span data-if="cpp" style="display:none">Images</span><span data-if="com" style="display:none">Images</span><span data-if="dotnet" style="display:none">images</span><span data-if="python" style="display:none">images</span></code></b> (input_object)  </span><span>singlechannelimage(-array) <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="c" style="display:none">Hobject</span> (byte / uint2)</span>
</div>
<p class="pardesc">Array with at least three input images with different
directions of illumination.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="HeightField" class="parname"><b><code><span data-if="hdevelop" style="display:inline">HeightField</span><span data-if="c" style="display:none">HeightField</span><span data-if="cpp" style="display:none">HeightField</span><span data-if="com" style="display:none">HeightField</span><span data-if="dotnet" style="display:none">heightField</span><span data-if="python" style="display:none">height_field</span></code></b> (output_object)  </span><span>image <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="c" style="display:none">Hobject *</span> (real)</span>
</div>
<p class="pardesc">Reconstructed height field.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Gradient" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></b> (output_object)  </span><span>image <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="c" style="display:none">Hobject *</span> (vector_field)</span>
</div>
<p class="pardesc">The gradient field of the surface.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Albedo" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Albedo</span><span data-if="c" style="display:none">Albedo</span><span data-if="cpp" style="display:none">Albedo</span><span data-if="com" style="display:none">Albedo</span><span data-if="dotnet" style="display:none">albedo</span><span data-if="python" style="display:none">albedo</span></code></b> (output_object)  </span><span>image <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="c" style="display:none">Hobject *</span> (real)</span>
</div>
<p class="pardesc">The albedo of the surface.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Slants" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Slants</span><span data-if="c" style="display:none">Slants</span><span data-if="cpp" style="display:none">Slants</span><span data-if="com" style="display:none">Slants</span><span data-if="dotnet" style="display:none">slants</span><span data-if="python" style="display:none">slants</span></code></b> (input_control)  </span><span>angle.deg-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Angle between the camera and the direction of
illumination (in degrees).</p>
<p class="pardesc"><span class="parcat">Default:
      </span>45.0</p>
<p class="pardesc"><span class="parcat">Suggested values:
      </span>1.0, 5.0, 10.0, 20.0, 40.0, 60.0, 90.0</p>
<p class="pardesc"><span class="parcat">Value range:
      </span><code>0.0
          ≤
        
    <span data-if="hdevelop" style="display:inline">Slants</span>
    <span data-if="c" style="display:none">Slants</span>
    <span data-if="cpp" style="display:none">Slants</span>
    <span data-if="com" style="display:none">Slants</span>
    <span data-if="dotnet" style="display:none">slants</span>
    <span data-if="python" style="display:none">slants</span>
    
          ≤
          180.0</code> (lin)</p>
<p class="pardesc"><span class="parcat">Minimum increment:
      </span>0.01</p>
<p class="pardesc"><span class="parcat">Recommended increment:
      </span>10.0</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Tilts" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Tilts</span><span data-if="c" style="display:none">Tilts</span><span data-if="cpp" style="display:none">Tilts</span><span data-if="com" style="display:none">Tilts</span><span data-if="dotnet" style="display:none">tilts</span><span data-if="python" style="display:none">tilts</span></code></b> (input_control)  </span><span>angle.deg-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Angle of the direction of illumination within the
object plane (in degrees).</p>
<p class="pardesc"><span class="parcat">Default:
      </span>45.0</p>
<p class="pardesc"><span class="parcat">Suggested values:
      </span>1.0, 5.0, 10.0, 20.0, 40.0, 60.0, 90.0</p>
<p class="pardesc"><span class="parcat">Value range:
      </span><code>0.0
          ≤
        
    <span data-if="hdevelop" style="display:inline">Tilts</span>
    <span data-if="c" style="display:none">Tilts</span>
    <span data-if="cpp" style="display:none">Tilts</span>
    <span data-if="com" style="display:none">Tilts</span>
    <span data-if="dotnet" style="display:none">tilts</span>
    <span data-if="python" style="display:none">tilts</span>
    
          ≤
          360.0</code> (lin)</p>
<p class="pardesc"><span class="parcat">Minimum increment:
      </span>0.01</p>
<p class="pardesc"><span class="parcat">Recommended increment:
      </span>10.0</p>
</div>
  <div class="par">
<div class="parhead">
<span id="ResultType" class="parname"><b><code><span data-if="hdevelop" style="display:inline">ResultType</span><span data-if="c" style="display:none">ResultType</span><span data-if="cpp" style="display:none">ResultType</span><span data-if="com" style="display:none">ResultType</span><span data-if="dotnet" style="display:none">resultType</span><span data-if="python" style="display:none">result_type</span></code></b> (input_control)  </span><span>string-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[str]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Types of the requested results.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>
    <span data-if="hdevelop" style="display:inline">'all'</span>
    <span data-if="c" style="display:none">"all"</span>
    <span data-if="cpp" style="display:none">"all"</span>
    <span data-if="com" style="display:none">"all"</span>
    <span data-if="dotnet" style="display:none">"all"</span>
    <span data-if="python" style="display:none">"all"</span>
</p>
<p class="pardesc"><span class="parcat">List of values:
      </span>[], <span data-if="hdevelop" style="display:inline">'albedo'</span><span data-if="c" style="display:none">"albedo"</span><span data-if="cpp" style="display:none">"albedo"</span><span data-if="com" style="display:none">"albedo"</span><span data-if="dotnet" style="display:none">"albedo"</span><span data-if="python" style="display:none">"albedo"</span>, <span data-if="hdevelop" style="display:inline">'all'</span><span data-if="c" style="display:none">"all"</span><span data-if="cpp" style="display:none">"all"</span><span data-if="com" style="display:none">"all"</span><span data-if="dotnet" style="display:none">"all"</span><span data-if="python" style="display:none">"all"</span>, <span data-if="hdevelop" style="display:inline">'gradient'</span><span data-if="c" style="display:none">"gradient"</span><span data-if="cpp" style="display:none">"gradient"</span><span data-if="com" style="display:none">"gradient"</span><span data-if="dotnet" style="display:none">"gradient"</span><span data-if="python" style="display:none">"gradient"</span>, <span data-if="hdevelop" style="display:inline">'height_field'</span><span data-if="c" style="display:none">"height_field"</span><span data-if="cpp" style="display:none">"height_field"</span><span data-if="com" style="display:none">"height_field"</span><span data-if="dotnet" style="display:none">"height_field"</span><span data-if="python" style="display:none">"height_field"</span>, <span data-if="hdevelop" style="display:inline">'normalized_surface_normal'</span><span data-if="c" style="display:none">"normalized_surface_normal"</span><span data-if="cpp" style="display:none">"normalized_surface_normal"</span><span data-if="com" style="display:none">"normalized_surface_normal"</span><span data-if="dotnet" style="display:none">"normalized_surface_normal"</span><span data-if="python" style="display:none">"normalized_surface_normal"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="ReconstructionMethod" class="parname"><b><code><span data-if="hdevelop" style="display:inline">ReconstructionMethod</span><span data-if="c" style="display:none">ReconstructionMethod</span><span data-if="cpp" style="display:none">ReconstructionMethod</span><span data-if="com" style="display:none">ReconstructionMethod</span><span data-if="dotnet" style="display:none">reconstructionMethod</span><span data-if="python" style="display:none">reconstruction_method</span></code></b> (input_control)  </span><span>string <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">str</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Type of the reconstruction method.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>
    <span data-if="hdevelop" style="display:inline">'poisson'</span>
    <span data-if="c" style="display:none">"poisson"</span>
    <span data-if="cpp" style="display:none">"poisson"</span>
    <span data-if="com" style="display:none">"poisson"</span>
    <span data-if="dotnet" style="display:none">"poisson"</span>
    <span data-if="python" style="display:none">"poisson"</span>
</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'fft_cyclic'</span><span data-if="c" style="display:none">"fft_cyclic"</span><span data-if="cpp" style="display:none">"fft_cyclic"</span><span data-if="com" style="display:none">"fft_cyclic"</span><span data-if="dotnet" style="display:none">"fft_cyclic"</span><span data-if="python" style="display:none">"fft_cyclic"</span>, <span data-if="hdevelop" style="display:inline">'poisson'</span><span data-if="c" style="display:none">"poisson"</span><span data-if="cpp" style="display:none">"poisson"</span><span data-if="com" style="display:none">"poisson"</span><span data-if="dotnet" style="display:none">"poisson"</span><span data-if="python" style="display:none">"poisson"</span>, <span data-if="hdevelop" style="display:inline">'rft_cyclic'</span><span data-if="c" style="display:none">"rft_cyclic"</span><span data-if="cpp" style="display:none">"rft_cyclic"</span><span data-if="com" style="display:none">"rft_cyclic"</span><span data-if="dotnet" style="display:none">"rft_cyclic"</span><span data-if="python" style="display:none">"rft_cyclic"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="GenParamName" class="parname"><b><code><span data-if="hdevelop" style="display:inline">GenParamName</span><span data-if="c" style="display:none">GenParamName</span><span data-if="cpp" style="display:none">GenParamName</span><span data-if="com" style="display:none">GenParamName</span><span data-if="dotnet" style="display:none">genParamName</span><span data-if="python" style="display:none">gen_param_name</span></code></b> (input_control)  </span><span>string-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[str]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Names of the generic parameters.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>[]</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'caching'</span><span data-if="c" style="display:none">"caching"</span><span data-if="cpp" style="display:none">"caching"</span><span data-if="com" style="display:none">"caching"</span><span data-if="dotnet" style="display:none">"caching"</span><span data-if="python" style="display:none">"caching"</span>, <span data-if="hdevelop" style="display:inline">'optimize_speed'</span><span data-if="c" style="display:none">"optimize_speed"</span><span data-if="cpp" style="display:none">"optimize_speed"</span><span data-if="com" style="display:none">"optimize_speed"</span><span data-if="dotnet" style="display:none">"optimize_speed"</span><span data-if="python" style="display:none">"optimize_speed"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="GenParamValue" class="parname"><b><code><span data-if="hdevelop" style="display:inline">GenParamValue</span><span data-if="c" style="display:none">GenParamValue</span><span data-if="cpp" style="display:none">GenParamValue</span><span data-if="com" style="display:none">GenParamValue</span><span data-if="dotnet" style="display:none">genParamValue</span><span data-if="python" style="display:none">gen_param_value</span></code></b> (input_control)  </span><span>integer-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[int, float, str]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (integer / </span><span data-if="hdevelop" style="display:inline">real / </span><span data-if="hdevelop" style="display:inline">string)</span><span data-if="dotnet" style="display:none"> (<i>int</i> / </span><span data-if="dotnet" style="display:none">long / </span><span data-if="dotnet" style="display:none">double / </span><span data-if="dotnet" style="display:none">string)</span><span data-if="cpp" style="display:none"> (<i>Hlong</i> / </span><span data-if="cpp" style="display:none">double / </span><span data-if="cpp" style="display:none">HString)</span><span data-if="c" style="display:none"> (<i>Hlong</i> / </span><span data-if="c" style="display:none">double / </span><span data-if="c" style="display:none">char*)</span></span>
</div>
<p class="pardesc">Values of the generic parameters.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>[]</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'exhaustive'</span><span data-if="c" style="display:none">"exhaustive"</span><span data-if="cpp" style="display:none">"exhaustive"</span><span data-if="com" style="display:none">"exhaustive"</span><span data-if="dotnet" style="display:none">"exhaustive"</span><span data-if="python" style="display:none">"exhaustive"</span>, <span data-if="hdevelop" style="display:inline">'free_cache'</span><span data-if="c" style="display:none">"free_cache"</span><span data-if="cpp" style="display:none">"free_cache"</span><span data-if="com" style="display:none">"free_cache"</span><span data-if="dotnet" style="display:none">"free_cache"</span><span data-if="python" style="display:none">"free_cache"</span>, <span data-if="hdevelop" style="display:inline">'no_cache'</span><span data-if="c" style="display:none">"no_cache"</span><span data-if="cpp" style="display:none">"no_cache"</span><span data-if="com" style="display:none">"no_cache"</span><span data-if="dotnet" style="display:none">"no_cache"</span><span data-if="python" style="display:none">"no_cache"</span>, <span data-if="hdevelop" style="display:inline">'patient'</span><span data-if="c" style="display:none">"patient"</span><span data-if="cpp" style="display:none">"patient"</span><span data-if="com" style="display:none">"patient"</span><span data-if="dotnet" style="display:none">"patient"</span><span data-if="python" style="display:none">"patient"</span>, <span data-if="hdevelop" style="display:inline">'standard'</span><span data-if="c" style="display:none">"standard"</span><span data-if="cpp" style="display:none">"standard"</span><span data-if="com" style="display:none">"standard"</span><span data-if="dotnet" style="display:none">"standard"</span><span data-if="python" style="display:none">"standard"</span>, <span data-if="hdevelop" style="display:inline">'use_cache'</span><span data-if="c" style="display:none">"use_cache"</span><span data-if="cpp" style="display:none">"use_cache"</span><span data-if="com" style="display:none">"use_cache"</span><span data-if="dotnet" style="display:none">"use_cache"</span><span data-if="python" style="display:none">"use_cache"</span></p>
</div>
<h2 id="sec_result">结果</h2>
<p>If the parameters are valid, <code><span data-if="hdevelop" style="display:inline">photometric_stereo</span><span data-if="c" style="display:none">photometric_stereo</span><span data-if="cpp" style="display:none">PhotometricStereo</span><span data-if="com" style="display:none">PhotometricStereo</span><span data-if="dotnet" style="display:none">PhotometricStereo</span><span data-if="python" style="display:none">photometric_stereo</span></code> returns the
value <TT>2</TT> (
      <TT>H_MSG_TRUE</TT>)
    .  如有必要，将引发异常。</p>
<h2 id="sec_predecessors">可能的前置算子</h2>
<p>
<code><a href="optimize_fft_speed.html"><span data-if="hdevelop" style="display:inline">optimize_fft_speed</span><span data-if="c" style="display:none">optimize_fft_speed</span><span data-if="cpp" style="display:none">OptimizeFftSpeed</span><span data-if="com" style="display:none">OptimizeFftSpeed</span><span data-if="dotnet" style="display:none">OptimizeFftSpeed</span><span data-if="python" style="display:none">optimize_fft_speed</span></a></code>
</p>
<h2 id="sec_module">模块</h2>
<p>
3D Metrology</p>
<!--OP_REF_FOOTER_START-->
<hr>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<div class="footer">
<div class="copyright">HALCON算子参考手册 Copyright © 2015-2023 51Halcon</div>
</div>
</div>
</body>
</html>
